package com.msb.c01;

/**
 * @author: xw
 * @create: 2022/9/22 10:34
 * @description:
 */
public class Code03_Sleep_Yield_Join {
    /**
     *     sleep () 方法给其他线程运行机会时不考虑线程的优先级，因此会给低优先级的线程以运行的机会；
     *     yield () 方法只会给相同优先级或更高优先级的线程以运行的机会；
     *     线程执行 sleep () 方法后转入阻塞 (blocked) 状态，而执行 yield () 方法后转入就绪 (ready) 状态；
     *     sleep () 方法声明会抛出 InterruptedException, 而 yield () 方法没有声明任何异常；
     *     sleep () 方法比 yield () 方法具有更好的移植性 (跟操作系统 CPU 调度相关)。
     */
    static void testSleep() {
        new Thread(()->{
            for(int i=0; i<20; i++) {
                System.out.println("A" + i);
                try {
                    Thread.sleep(2000);
                    //TimeUnit.Milliseconds.sleep(500)
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    static void testYield(){
        new Thread(()->{
            for(int i=0; i<100; i++) {
                System.out.println("A" + i);
                if(i%10 == 0) {
                    Thread.yield();
                }
            }
        }).start();

        new Thread(()->{
            for(int i=0; i<100; i++) {
                System.out.println("------------B" + i);
                if(i%10 == 0) {
                    Thread.yield();
                }
            }
        }).start();
    }

    /**
     * 在某个线程中执行了另一个线程的join()方法，例如a线程中执行了b.join()，那么a就要等b执行完，才会执行自己。
     */
    static void testJoin() {
        Thread t1 = new Thread(()->{
            for(int i=0; i<100; i++) {
                System.out.println("A" + i);
                try {
                    Thread.sleep(500);
                    //TimeUnit.Milliseconds.sleep(500)
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread t2 = new Thread(()->{

            try {
                t1.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            for(int i=0; i<100; i++) {
                System.out.println("B" + i);
                try {
                    Thread.sleep(500);
                    //TimeUnit.Milliseconds.sleep(500)
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        t1.start();
        t2.start();
    }

    public static void main(String[] args) {
//        testSleep();
//        testYield();
        testJoin();
        for (int i = 0; i < 100; i++) {
            System.out.println("mian" +i);
            try {
                Thread.sleep(500);
                //TimeUnit.Milliseconds.sleep(500)
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}
